# 从 src 核心的通用模块导入所有内容
from src.Core.Common import *
# 从 src 核心的图管理模块导入图管理单例
from src.Core.GraphManager import GraphManagerSingleton

# 使用单例装饰器，确保该类只有一个实例
@SingletonDecorator
class PathsRegistry(object):
    """
    路径注册表类，用于保存节点和引脚的路径。
    可以重建路径，并根据路径返回对应的实体（节点或引脚）。
    """

    def __init__(self):
        # 初始化一个字典，用于存储路径和对应实体（节点或引脚）的映射关系
        self._data = {}

    def rebuild(self):
        """
        重建路径注册表。
        清空现有的路径数据，并从图管理单例中获取所有节点，重新生成节点和引脚的路径信息。
        """
        # 获取图管理单例的实例
        man = GraphManagerSingleton().get()
        # 获取图管理单例中的所有节点
        allNodes = man.getAllNodes()
        # 清空存储路径数据的字典
        self._data.clear()
        # 遍历所有节点
        for node in allNodes:
            # 将节点的路径和节点本身添加到字典中
            self._data[node.path()] = node
            # 遍历节点的所有引脚
            for pin in node.pins:
                # 将引脚的路径和引脚本身添加到字典中
                self._data[pin.path()] = pin

    def getAllPaths(self):
        """
        获取路径注册表中所有的路径。

        :return: 包含所有路径的列表
        """
        return list(self._data)

    def contains(self, path):
        """
        检查路径注册表中是否包含指定的路径。

        :param path: 要检查的路径
        :return: 如果包含该路径返回 True，否则返回 False
        """
        return path in self._data

    # def resolvePath(self, base, path):
    #     """
    #     解析路径，将基础路径和指定路径拼接并规范化。
    #
    #     :param base: 基础路径
    #     :param path: 指定路径
    #     :return: 解析后的路径
    #     """
    #     temp = os.path.normpath(os.path.join(base, path))
    #     res = "/".join(temp.split(os.sep))

    def getEntity(self, path):
        """
        根据路径获取对应的实体（节点或引脚）。

        :param path: 要查找的路径
        :return: 如果路径存在，返回对应的实体；否则返回 None
        """
        if self.contains(path):
            return self._data[path]
        return None